package com.fxu.framework.core.enums;

import cn.hutool.core.lang.Filter;

import java.io.Serializable;
import java.util.Collection;

/**
 * 枚举基础接口
 * @param <K> code的类型
 * @param <V> desc的类型
 * @version 1.0.0
 */
public interface BaseEnum<K, V extends Serializable> {
    K code();
    V desc();

    /**
     * 找到一个满足条件数据，否则返回null
     * @param array 数据数组
     * @param find 查找元素
     * @param <T> 数据类型
     * @return 符合条件数据
     */
    static <T> boolean has(T[] array, T find) {
        if (null != array && null != find && array.length > 0) {
            for (T t : array) {
                if (find.equals(t)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 找到一个满足条件数据，否则返回null
     * @param array 数据数组
     * @param filter 条件函数
     * @param <T> 数据类型
     * @return 符合条件数据
     */
    static <T> T findOne(T[] array, Filter<T> filter) {
        if (null != array && null != filter && array.length > 0) {
            for (T t : array) {
                if (filter.accept(t)) {
                    return t;
                }
            }
        }
        return null;
    }

    /**
     * 判断是否有一个数据满足条件
     * @param array 数据集合
     * @param filter 条件函数
     * @param <T> 数据类型
     * @return 有符合条件数据返回true，没有返回false
     */
    static <T> boolean hasAny(Collection<T> array, Filter<T> filter) {
        if (null != array && null != filter && array.size() > 0) {
            for (T t : array) {
                if (filter.accept(t)) {
                    return true;
                }
            }
        }
        return false;
    }
}
